package com.geek.javase.ch18.videodemo.reflect.methods;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/*
 *@Date 2025/11/5
 *@Author wangpeng
 *@Description
 *  *  * 1.Object invoke(Object obj, Object... args) 调用指定对象obj的该方法 , args：调用方法时传递的参数
 *  * 2.void setAccessible(true) 设置是否取消权限检查，true取消权限检查，false表示不取消(暴力反射)
 *  *
 *  * 如何执行Method方法？
 *  * 步骤
 *  * 1.获取类类型，即Class对象
 *  * 2.通过Class对象，获取Method方法对象
 *  * 3.调用Method中的invoke(Object obj, Object... args)执行方法，获得方法的返回值

 */
public class MethodsDemo2 {
    public static void main(String[] args) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, InvocationTargetException {
        //1.获取User 类类型
        Class<User> clazz = User.class;
        //2.获取方法对象
        Method playMethod = clazz.getDeclaredMethod("play", int.class);
        System.out.println("playMethod:"+playMethod);

        Method sleepMethod = clazz.getDeclaredMethod("sleep");
        System.out.println("sleepMethod:"+sleepMethod);

        //3.执行Method方法
        User user = clazz.newInstance();
        user.setName("小明");
        /*
         * invoke()
         * 第一个参数：执行的对象
         * 第二个参数：执行方法的形参列表
         * 返回值：执行的方法是void则返回值为null，执行的方法有返回值则直接返回
         */
        Object result1 = playMethod.invoke(user, 20);
        System.out.println(result1);
        //取消访问权限检查
        sleepMethod.setAccessible(true);
        Object result2 = sleepMethod.invoke(user);
        System.out.println(result2);
    }
}
